home *** CD-ROM | disk | FTP | other *** search
/ Mars Digital Image Map / Mars Digital Image Map - Disc 6.iso / software / vax / mdimdisp.for < prev    next >
Text File  |  1991-09-05  |  17KB  |  496 lines

  1. C***********************************************************************
  2. C_TITLE: MDIMDISP - Display an MDIM image on a Micro-VAX/GPX workstation 
  3. C
  4. C_DESCR: This software is a highly-simplified example program for display
  5. C        of MDIM images located on CDROM media. The program is designed
  6. C        to demonstrate how to extract image data from an MDIM file and 
  7. C        then display the data.
  8. C
  9. C        The program was developed exclusively for a VAX-station with a
  10. C        GPX color display. See Micro-VMS Workstation Software: Graphics
  11. C        Programming Guide (version 3.0, May 1986) for a description
  12. C        of the graphics routines used in this program.
  13. C
  14. C        The program assumes there is a standard VAX/VMS software 
  15. C        interface to the CDROM disc. Currently, under version 5 of
  16. C        VMS there is not a system interface to the ISO/CDROM standard.
  17. C        However, there is a DEC beta-test version CDROM interface,
  18. C        "VFS Mount Field Test Tool Kit", that provides access to ISO
  19. C        standard disks. The driver software is not generally available
  20. C        from DEC. It can be obtained from Jason Hyon, PDS, at the 
  21. C        following address:
  22. C        Jason Hyon
  23. C        Jet Propulsion Laboratory
  24. C        MS 168-514
  25. C        4800 Oak Grove Drive
  26. C        Pasadena, CA 91109
  27. C
  28. C        The program functions as follows:
  29. C        1) MDIMDISP will prompt the user for the desired size of the
  30. C           window used for display of the image. The default display
  31. C           size is 15 centimeters.
  32. C        2) Next the users is prompted to input the name of the
  33. C           CDROM image file to display.
  34. C        3) The display window is then created for eventual display
  35. C           of the image data.
  36. C        4) The program reads the entire image into memory
  37. C        5) An "auto-stretch" is performed on the image data to generate
  38. C           an optimum display of the data.
  39. C        6) The image is then send to the display window.
  40. C        7) The program prompts the user for the next image to display.
  41. C
  42. C        The program works best with the 1/64-th degree scale MDIM images 
  43. C        because these images fit nicely into the default window size. It
  44. C        is possible to display larger images with MDIMDISP. However, only
  45. C        a part of the whole image can be viewed at any given time. The
  46. C        program initially displays as much data as can be viewed in the
  47. C        display window. The lower-left part of the image will be displayed.
  48. C        Other parts of the image can be display by altering the size of the
  49. C        window with the mouse control (the standard mouse control features
  50. C        are utilized.)
  51. C
  52. C        The program can be complied and linked with the simple commands:
  53. C        $FOR  MDIMDISP
  54. C        $LINK MDIMDISP
  55. C
  56. C        This program was adapted from the CDIMAGE software created by
  57. C        Robert Mehlman at UCLA/IGPP.
  58. C
  59. C_HIST   28May87 RMehlman, UCLA/IGPP, Original version called CDIMAGE
  60. C        21Jul91 EEliason, USGS, Modified to work on MDIM images
  61. C
  62. C***************************************************************************
  63.       PROGRAM MDIMDISP
  64.       IMPLICIT INTEGER(U-W)
  65.       INCLUDE 'SYS$LIBRARY:UISENTRY'
  66.       INCLUDE 'SYS$LIBRARY:UISUSRDEF'
  67.       PARAMETER (MCOUNT=256)
  68.       CHARACTER*64 IFILE
  69.       REAL*4 R(0:MCOUNT),G(0:MCOUNT),B(0:MCOUNT)
  70.       INTEGER*4 VCM_ATT(3),CMS_ID
  71.       
  72.       BYTE KBUF(8000000)
  73.  
  74.       INTEGER*4      IHIST(256)
  75.       CHARACTER*4096 HSTR
  76.       EQUIVALENCE (HSTR,IHIST)
  77.  
  78.       CHARACTER*4096 STR
  79.       BYTE BUF(4096)
  80.       EQUIVALENCE (STR,BUF)
  81.  
  82.       REAL*4 HIST(256),XHIST(256)
  83.  
  84.       REAL*4 X1,Y1,X2,Y2,WIDTH,HEIGHT,SIZE,DEFSIZ
  85.       DATA  X1, Y1,  X2,  Y2,DEFSIZ
  86.      1    /0.0,0.0,100.0,100.0,  15./
  87.  
  88.       DATA IIN,IOUT,LBLK,ICOUNT, IEXCL,NLEV
  89.      1    /  5,   6, 512,   128,-32768, 128/
  90.  
  91.  
  92.       DATA NHIST/256/
  93.       COMMON/PRT/ IOUT,IIN
  94.  
  95. C***********************************************************************
  96. C Enter the viewport size in centimeters
  97. C***********************************************************************
  98.       WRITE (IOUT,900)
  99.  900  FORMAT ('$Enter side of viewport in centimeters (default 15.): ')
  100.       READ (IIN,901) SIZE
  101.  901  FORMAT (F10.0)
  102.  
  103.       IF (SIZE.LE.0.) SIZE=DEFSIZ
  104.       WIDTH=SIZE
  105.       HEIGHT=SIZE
  106.  
  107.       IFIRST = 0
  108.  
  109. C***********************************************************************
  110. C Top of loop. Prompt user for the name of the MDIM file 
  111. C***********************************************************************
  112.  1000 CONTINUE
  113.  
  114.       WRITE(IOUT,903)
  115.   903 FORMAT('$Enter MDIM input file to display: ')
  116.       READ(IIN,904,END=9000) IFILE
  117.   904 FORMAT(A)
  118.  
  119.       ID=10
  120.       OPEN (UNIT=ID,NAME=IFILE,STATUS='OLD',ACCESS='SEQUENTIAL',
  121.      . FORM='FORMATTED',READONLY)
  122.  
  123. C************************************************************************
  124. C  Set up for colors and for display
  125. C************************************************************************
  126.       IF (IFIRST.EQ.0) THEN
  127.         IFIRST = 1
  128.         VCM_ATT(1)=VCMAL$C_ATTRIBUTES
  129.         VCM_ATT(2)=VCMAL$M_NO_BIND
  130.         VCM_ATT(3)=VCMAL$C_END_OF_LIST
  131.         VCM_ID=UIS$CREATE_COLOR_MAP(ICOUNT,,VCM_ATT)
  132.         CMS_ID=UIS$CREATE_COLOR_MAP_SEG(VCM_ID,'SYS$WORKSTATION',
  133.      .   UIS$C_COLOR_GENERAL)
  134.         VD_ID=UIS$CREATE_DISPLAY(X1,Y1,X2,Y2,WIDTH,HEIGHT,VCM_ID)
  135.         WD_ID=UIS$CREATE_WINDOW(VD_ID,'SYS$WORKSTATION','IMAGE')
  136.         CALL COLORSET(R,G,B,ICOUNT)
  137.         CALL UIS$SET_COLORS(VD_ID,0,ICOUNT,R,G,B)
  138.         CALL UIS$SET_WRITING_MODE(VD_ID,1,1,UIS$C_MODE_COPY)
  139.       END IF
  140.  
  141.  
  142. C***********************************************************************
  143. C Read the PDS label, make tests, return the following information.
  144. C
  145. C NLREC   = number of label records in file
  146. C NHREC   = number of histogram records in file
  147. C NIREC   = number of image records in file
  148. C ICHKSUM = check sum of image found on labels
  149. C INL     = number of lines in image
  150. C INS     = number of samples in image
  151. C IERROR  = error return code
  152. C***************************************************************************
  153.       CALL RDLAB(ID, NLREC, NHREC, NIREC, ICHKSUM, INL, INS, IERROR)
  154.       IF (IERROR.NE.0) GOTO 9010
  155.  
  156.       WRITE(IOUT,975) INL,INS
  157.   975 FORMAT(' Number of lines and samples: ',2i5)
  158.  
  159. C***********************************************************************
  160. C Read the image histogram object
  161. C***********************************************************************
  162.       DO I = 1,NHREC
  163.          READ(ID,'(A)',END=9015) HSTR((I-1)*INS+1:(I-1)*INS+INS)
  164.       END DO
  165.  
  166. C**********************************************************************
  167. C Read the image data
  168. C**********************************************************************
  169.       DO I = 1,NIREC
  170.          READ(ID,'(A)',END=9015) STR(1:INS)
  171.          CALL B2B(BUF,KBUF((I-1)*INS+1),INS)
  172.       END DO
  173.  
  174.       CLOSE (UNIT=ID)
  175.  
  176.       NCOL = INS
  177.       NROW = INL
  178.       NPIXEL = NROW*NCOL
  179.       IQ=0
  180.  
  181. C***************************************************************************
  182. C Find low 0.1% of histogram maximum
  183. C***************************************************************************
  184.       ICNT = 0
  185.       IMINMAX = NPIXEL*0.001
  186.       LSMIN = 0
  187.       DO I = 2,NHIST
  188.          ICNT = ICNT + IHIST(I)
  189.          IF (ICNT.GT.IMINMAX) THEN
  190.             LSMIN = I
  191.             IF (LSMIN.LT.0) LSMIN = 0
  192.             GOTO 1010
  193.          END IF
  194.       END DO
  195.  1010 CONTINUE
  196.  
  197. C***************************************************************************
  198. C Find the high 0.1% of histogram maximum
  199. C***************************************************************************
  200.       ICNT = 0
  201.       LSMAX = 255
  202.       DO I = NHIST,2,-1
  203.          ICNT = ICNT + IHIST(I)
  204.          IF (ICNT.GT.IMINMAX) THEN
  205.             LSMAX = I
  206.             IF (LSMAX.GT.255) LSMAX = 255
  207.             GOTO 1020
  208.          END IF
  209.       END DO
  210.  1020 CONTINUE
  211.  
  212. C**************************************************************************
  213. C  Perform an  auto-stretch before display of the data.
  214. C  The LSMIN and LSMAX parameters specify the range of data for stretch.
  215. C**************************************************************************
  216.       CALL LINSTR(KBUF,KBUF,NPIXEL,IEXCL,LSMIN,LSMAX,NLEV)
  217.  
  218. C***************************************************************************
  219. C Display the image
  220. C***************************************************************************
  221.       CALL UIS$IMAGE(VD_ID,1,X1,Y1,X2,Y2,NCOL,NROW,8,KBUF)
  222.  
  223. C****************************************************************************
  224. C All done
  225. C***************************************************************************
  226.       GOTO 1000
  227.  
  228.  9000 CONTINUE
  229.       CALL UIS$DELETE_DISPLAY(VD_ID)
  230.       STOP
  231. C*************************************************************************
  232. C Handle some errors
  233. C*************************************************************************
  234.  9010 CONTINUE
  235.       WRITE(IOUT,810)
  236.   810 FORMAT(' *** ERROR *** Can not read PDS labels on MDIM input')
  237.       GOTO 9000
  238.  
  239.  9015 CONTINUE
  240.       WRITE(IOUT,815)
  241.   815 FORMAT(' *** ERROR *** Unexpected end-of-file in MDIM input')
  242.       GOTO 9000
  243.  
  244.       END
  245.       SUBROUTINE LINSTR(IA,JA,N,IEXCL,MIN,MAX,NLEV)
  246.       BYTE IA(N),JA(N)
  247.  
  248.       F=FLOAT(NLEV-1)/(MAX-MIN)
  249.  
  250.       DO 40 I = 1,N
  251.          J=IA(I)
  252.          IF (J.LT.0) J=J+256
  253.          IF (J.LE.MIN) J=MIN
  254.          IF (J.GE.MAX) J=MAX
  255.          J=F*(J-MIN)+.5
  256.          J = J + 128
  257.          IF (J.GE.128) J=J-256
  258.          JA(I)=J
  259.  40   CONTINUE
  260.       RETURN
  261.       END
  262.       SUBROUTINE RDLAB(ID,NLREC,NHREC,NIREC,ICHKSUM,INL,INS,IERROR)
  263. C***********************************************************************
  264. C Read image label records and test for errors, return the parameters:
  265. C
  266. C NLREC   = number of label records
  267. C NHREC   = number of histogram records
  268. C NIREC   = number of image records
  269. C ICHKSUM = check sum in image file
  270. C INL     = number of lines
  271. C INS     = number of samples
  272. C IERROR  = error return code
  273. C**************************************************************************
  274.       COMMON /PRT/ IPR,IIN
  275.       CHARACTER*32768 LABSTR
  276.       
  277.       IERROR = 0
  278.       LABSTR = ' '
  279.  
  280.       IREC = 1
  281.       READ(ID,900,END=9005) NCHAR,LABSTR(1:NCHAR)
  282.   900 FORMAT(Q,A)
  283.  
  284.       IF (NCHAR.LE.250) THEN
  285.          IREC = 2
  286.          I1 = NCHAR + 1
  287.          I2 = 2*NCHAR
  288.          READ(ID,900,END=9005) NCHAR,LABSTR(I1:I2)
  289.       END IF
  290.  
  291. C************************************************************************
  292. C Determine the number of label records
  293. C************************************************************************
  294.       I = INDEX(LABSTR(1:IREC*NCHAR),'LABEL_RECORDS ')
  295.       IF (I.EQ.0) GOTO 9010
  296.       J = INDEX(LABSTR(I:IREC*NCHAR),'=')
  297.       IF (J.EQ.0) GOTO 9010
  298.       READ(LABSTR(I+J+1:I+J+2),'(i2)') NLREC
  299.  
  300. C***********************************************************************
  301. C Read the remaining label records
  302. C***********************************************************************
  303.       IB = 1
  304.       NBYTES = IREC*NCHAR
  305.       KREC = IREC
  306.       DO ILAB = 1,NLREC-KREC
  307.          IB = IB + IREC*NCHAR
  308.          IREC = 1
  309.          READ(ID,900,END=9005) NCHAR,LABSTR(IB:IB+NCHAR)
  310.          NBYTES = NBYTES + NCHAR
  311.       END DO
  312.       NCHAR = NBYTES
  313.       
  314. C************************************************************************
  315. C Find pointer to IMAGE_HISTOGRAM
  316. C************************************************************************
  317.       I = INDEX(LABSTR(1:NCHAR),'^IMAGE_HISTOGRAM ')
  318.       IF (I.EQ.0) GOTO 9020
  319.       J = INDEX(LABSTR(I:NCHAR),'=')
  320.       IF (J.EQ.0) GOTO 9020
  321.       READ(LABSTR(I+J+1:I+J+2),'(i2)') IHPOINT
  322.  
  323. C*************************************************************************
  324. C Find pointer to IMAGE
  325. C************************************************************************
  326.       I = INDEX(LABSTR(1:NCHAR),'^IMAGE ')
  327.       IF (I.EQ.0) GOTO 9030
  328.       J = INDEX(LABSTR(I:),'=')
  329.       IF (J.EQ.0) GOTO 9030
  330.       READ(LABSTR(I+J+1:I+J+2),'(I2)') IMPOINT
  331.  
  332. C************************************************************************
  333. C Find CHECKSUM 
  334. C************************************************************************
  335.       I = INDEX(LABSTR(1:NCHAR),'CHECKSUM ')
  336.       IF (I.EQ.0) GOTO 9040
  337.       J = INDEX(LABSTR(I:),'=')
  338.       IF (J.EQ.0) GOTO 9040
  339.       READ(LABSTR(I+J+1:I+J+9),'(I9)') ICHKSUM
  340.  
  341. C************************************************************************
  342. C Find LINES
  343. C************************************************************************
  344.       I = INDEX(LABSTR(1:NCHAR),' LINES ')
  345.       IF (I.EQ.0) GOTO 9050
  346.       J = INDEX(LABSTR(I:),'=')
  347.       IF (J.EQ.0) GOTO 9050
  348.       IFIRST = I + J + 1
  349.       ILAST = 0
  350.       I = IFIRST
  351.       DO WHILE(ILAST.EQ.0)
  352.          IF (LABSTR(I:I).NE.' ') THEN
  353.             IF (LABSTR(I:I).LT.'0'.OR.LABSTR(I:I).GT.'9') THEN
  354.                ILAST = I - 1
  355.             END IF
  356.          END IF      
  357.          I = I + 1
  358.       END DO     
  359.  
  360.       N = ILAST-IFIRST+1
  361.       READ(LABSTR(IFIRST:ILAST),'(I<N>)') INL
  362.       
  363. C************************************************************************
  364. C Find LINE_SAMPLES
  365. C************************************************************************
  366.       I = INDEX(LABSTR(1:NCHAR),' LINE_SAMPLES ')
  367.       IF (I.EQ.0) GOTO 9060
  368.       J = INDEX(LABSTR(I:),'=')
  369.       IF (J.EQ.0) GOTO 9060
  370.       IFIRST = I + J + 1
  371.       ILAST = 0
  372.       I = IFIRST
  373.       DO WHILE(ILAST.EQ.0)
  374.          IF (LABSTR(I:I).NE.' ') THEN
  375.             IF (LABSTR(I:I).LT.'0'.OR.LABSTR(I:I).GT.'9') THEN
  376.                ILAST = I - 1
  377.             END IF
  378.          END IF      
  379.          I = I + 1
  380.       END DO     
  381.  
  382.       N = ILAST-IFIRST+1
  383.       READ(LABSTR(IFIRST:ILAST),'(I<N>)') INS
  384.  
  385. C*************************************************************************  
  386. C Find the number of FILE_RECORDS 
  387. C*************************************************************************
  388.       I = INDEX(LABSTR(1:NCHAR),'FILE_RECORDS ')
  389.       IF (I.EQ.0) GOTO 9070
  390.       J = INDEX(LABSTR(I:),'=')
  391.       IF (J.EQ.0) GOTO 9070
  392.       READ(LABSTR(I+J+1:I+J+4),'(I4)') IFRECS
  393.  
  394. C**********************************************************************
  395. C Make sure END/cr/lf sequence exits
  396. C**********************************************************************
  397.       I = INDEX(LABSTR(1:NCHAR),'END'//CHAR(13)//CHAR(10))
  398.       IF (I.EQ.0) GOTO 9080
  399.  
  400. C***********************************************************************
  401. C Let's do some calculations. Determine:
  402. C NHREC,NIREC
  403. C**********************************************************************
  404.       NHREC = IMPOINT - IHPOINT
  405.       NIREC = IFRECS - IMPOINT +1
  406.       RETURN 
  407.  
  408. C***********************************************************************
  409. C Handle some errors
  410. C************************************************************************
  411.  9005 CONTINUE
  412.       WRITE(IPR,7005)
  413.  7005 FORMAT(
  414.      .' *** ERROR *** Unexpected end-of-file encountered in RDLAB')
  415.       IERROR = 1
  416.       RETURN
  417.  
  418.  9010 CONTINUE
  419.       WRITE(IPR,7010)
  420.  7010 FORMAT(
  421.      .' *** ERROR *** Error with LABEL_RECORDS keyword')
  422.       IERROR = 1
  423.       RETURN
  424.  
  425.  9020 CONTINUE
  426.       WRITE(IPR,7020)
  427.  7020 FORMAT(
  428.      .' *** ERROR *** Error in ^IMAGE_HISTOGRAM keyword')
  429.       IERROR = 1
  430.       RETURN
  431.  
  432.  9030 CONTINUE
  433.       WRITE(IPR,7030)
  434.  7030 FORMAT(
  435.      .' *** ERROR *** Error in ^IMAGE keyword')
  436.       IERROR = 1
  437.       RETURN
  438.  
  439.  9040 CONTINUE
  440.       WRITE(IPR,7040)
  441.  7040 FORMAT(
  442.      .' *** ERROR *** Error in CHECKSUM keyword')
  443.       IERROR = 1
  444.       RETURN
  445.  
  446.  9050 CONTINUE
  447.       WRITE(IPR,7050)
  448.  7050 FORMAT(
  449.      .' *** ERROR *** Error in LINES keyword')
  450.       IERROR = 1
  451.       RETURN
  452.  
  453.  9060 CONTINUE
  454.       WRITE(IPR,7060)
  455.  7060 FORMAT(
  456.      .' *** ERROR *** Error in LINE_SAMPLES keyword')
  457.       IERROR = 1
  458.       RETURN
  459.  
  460.  9070 CONTINUE
  461.       WRITE(IPR,7070)
  462.  7070 FORMAT(
  463.      .' *** ERROR *** Error in FILE_RECORDS keyword')
  464.       IERROR = 1
  465.       RETURN
  466.  
  467.  9080 CONTINUE
  468.       WRITE(IPR,7080)
  469.  7080 FORMAT(
  470.      .' *** ERROR *** END//cr//lf sequence not found in labels')
  471.       IERROR = 1
  472.       RETURN
  473.       END
  474.       SUBROUTINE COLORSET(R,G,B,MAPSIZE)
  475.       REAL*4 R(0:MAPSIZE),G(0:MAPSIZE),B(0:MAPSIZE)
  476.       DO IR = 0, MAPSIZE-1
  477.          R(IR) = FLOAT(IR)/FLOAT(MAPSIZE)
  478.          G(IR) = FLOAT(IR)/FLOAT(MAPSIZE)
  479.          B(IR) = FLOAT(IR)/FLOAT(MAPSIZE)
  480.       END DO
  481.       RETURN
  482.       END
  483.       SUBROUTINE B2B(IN,OUT,INS)
  484. C****************************************************************************
  485. C B2B simply moves data from the input buffer (IN) to the output buffer (OUT)
  486. C****************************************************************************
  487.       BYTE IN(1),OUT(1)
  488.       INTEGER*4 INS
  489.       DO I = 1, INS
  490.          OUT(I) = IN(I)
  491.       END DO
  492.       RETURN
  493.       END
  494.